<?php
/**
 * 数据库操作类
 */
class DB{
    /**
     * 成员属性, 数据库连接对象
     * @var resource
     */
    private $db;

    /**
     * 构造函数, 连接数据库
     * @return void
     */
    public function __construct(){
        // 连接数据库
        $this->db = mysql_connect(DBHOST, DBUSER, DBPASS);

        // 选择数据库
        if(!mysql_select_db(DBNAME, $this->db))
            die('can not select database!');

        // 设置为utf8
        mysql_query('SET NAMES utf8');
    }

    /**
     * 析构函数, 关闭数据库连接
     * @return void
     */
    public function close(){
        // 关闭数据库连接
        mysql_close($this->db);
    }

    /**
     * 数据库查询
     * @param  string $sql 要查询的sql语句
     * @return mixed      返回执行结果
     */
    private function query($sql){
        // 检查sql语句
        if(empty($sql))
            return false;

        // 返回执行结果
        return mysql_query($sql, $this->db);
    }

    /**
     * 将sql查询结果以单行返回
     * @param  string $sql sql查询语句
     * @return array      返回查询结果
     */
    private function fetch_row($sql){
        $result = $this->query($sql);

        return mysql_fetch_row($result);
    }

    /**
     * 将sql查询结果以数组返回
     * @param  string $sql 查询语句
     * @return array      返回查询结果
     */
    private function fetch_array($sql){
        $result = $this->query($sql);
        $ary = array();
        $row = mysql_fetch_assoc($result);

        while($row){
            $ary[] = $row;
            $row = mysql_fetch_assoc($result);
        }

        return $ary;
    }

    /**
     * 检查hash值是否存在, 若$t为true, 则检查torrage.com是否存在此hash
     * @param  string $hash 要检查的hash
     * @param  boolean  $t 是否检查torrage.com
     * @return boolean       返回数据是否存在
     */
    public function check($hash, $t=false){
        $sql = $t ? "SELECT `infohash` FROM `sc_hash` WHERE `infohash`='{$hash}';" : "SELECT * FROM `sc_info` WHERE `infohash`='{$hash}';";
        $result = $this->fetch_row($sql);

        return ($result >= 1) ? true : false;
    }

    /**
     * 获取torrage.com保存infohash数量
     * @return integer 返回infohash数量
     */
    public function hash_count(){
        $result = $this->fetch_row("SELECT COUNT(`infohash`) FROM `sc_hash`;");

        return $result;
    }

    /**
     * 插入hash信息
     * @param  array $btinfo hash信息数组
     * @return boolean         是否插入成功
     */
    public function insert($btinfo){
        // 生成sql语句
        $sql = "INSERT INTO `sc_info` (`infohash`, `name`, `length`, `hot`, `filecount`, `createtime`)";
        $sql .= " VALUES ('" . $btinfo['infohash'] . "', '" . $btinfo['name'] . "', " . $btinfo['length'] . ", " . $btinfo['hot'];
        $sql .= ", " . $btinfo['filecount'] . ", " . $btinfo['createtime'] . ");";

        // 检查是否插入成功
        if(!$this->query($sql))
            return false;

        // 返回插入列表
        return $this->insert_list($btinfo);
    }

    /**
     * 插入文件列表
     * @param  array $btinfo hash信息数组
     * @return boolean         返回成功标识
     */
    private function insert_list($btinfo){
        // 生成sql语句
        $sql = "INSERT INTO `sc_file` (`fid`, `file`, `length`) VALUES ";

        if(isset($btinfo['list'])){
            // 循环获取文件信息
            foreach($btinfo['list'] as $list){
                // 将文件信息加入sql语句
                $sql .= "(" . $btinfo['fid'] . ", '" . $list['file'] . "', " . $list['length'] . "),";
            }
            // 去除最后一个逗号
            $sql = substr($sql, 0, -1);
        }else{
            $sql .= "(" . $btinfo['fid'] . ", '" . $btinfo['file'] . "', " . $btinfo['length'] . ");";
        }

        // 返回添加成功标识
        return $this->query($sql);
    }

    /**
     * 更改hash热度
     * @param string $hash  hash值
     * @param integer $hot hash的热度
     */
    public function __set($hash, $hot){
        // 检查hash是否为空
        if(empty($hash))
            return false;

        $hash = substr($hash, 1);

        // 检查hash是否存在
        if(!$this->check($hash))
            return false;

        // 设置热度
        $hot = empty($hot) ? 0 : $hot;
        // 生成sql语句
        $sql = "UPDATE `sc_info` SET `hot`={$hot} WHERE `infohash`='{$hash}';";

        // 返回更改成功标识
        return $this->query($sql);
    }

    /**
     * 获取hash信息
     * @param  string $hash hash值
     * @return array       返回hash信息数组
     */
    public function __get($hash){
        // 检查hash是否为空
        if(empty($hash))
            return false;

        $hash = substr($hash, 1);

        if(!$this->check($hash))
            return false;

        // 生成sql语句
        $sql = "SELECT * FROM `sc_info` WHERE `infohash`='{$hash}';";
        // 查询出hash信息
        $result = $this->fetch_row($sql);
        // 对hash信息处理到一个数组中
        $btinfo = array(
            'infohash' => $result[0],
            'name' => $result[1],
            'length' => $result[2],
            'hot' => $result[3],
            'filecount' => $result[4],
            'createtime' => $result[5]
        );

        // 生成文件列表查询sql语句
        $sql = "SELECT * FROM `sc_file` WHERE `infohash`='{$hash}';";
        // 查询文件列表信息
        $list = $this->fetch_array($sql);

        // 循环获取文件信息
        foreach($list as $l){
            $btinfo['list'][] = array(
                'file' => $l['file'],
                'length' => $l['length']
            );
        }

        // 返回hash信息
        return $btinfo;
    }
}